package com.jt.service;


import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.jt.mapper.ItemCatMapper;
import com.jt.mapper.ItemDescMapper;
import com.jt.pojo.ItemCat;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class ItemCatServiceImpl implements ItemCatService {
    @Autowired
    private ItemCatMapper itemCatMapper;
    @Autowired
    private ItemDescMapper itemDescMapper;

    /**
     * type=1/2/3
     * 问题分析:
     * 1.提高程序的效率    减少数据库交互的次数
     * 2.查询的方法最好单独的抽取
     * 问题:如何有效存储父子关系
     * 数据结构:Map<key,value>
     * 说明:
     * Map<0,List<ItemCat>>     map.get(0)
     * Map<1,List<电子书刊,英文书籍>>
     * Map<24,List<少儿,0-2岁...>>
     *
     * @return
     */

    //1.封装一个Map集合
    public Map<Integer, List<ItemCat>> getMap() {
        Map<Integer, List<ItemCat>> map = new HashMap<Integer, List<ItemCat>>();
        //1.查询所有的数据信息
        List<ItemCat> list = itemCatMapper.selectList(null);
        //2.将list集合封装到Map集合中
        for (ItemCat itemCat : list) {
            //规则:判断Map中是否有key
            //没有key     该子级是第一个父级元素的孩子,应该声明父级并且将子级作为第一个子级
            //有key       我找到父级的子级序列 将子级追加到序列中即可
            if (map.containsKey(itemCat.getParentId())) {
                map.get(itemCat.getParentId()).add(itemCat);
                //有父级
            } else {
                //没有父级
                List<ItemCat> initList = new ArrayList<>();
                initList.add(itemCat);
                map.put(itemCat.getParentId(), initList);
            }
        }
        return map;
    }

    @Override

    public List<ItemCat> findItemCatList(Integer type) {
        //获取数据封装后的结果
        Map<Integer, List<ItemCat>> map = getMap();
        if (type == 1) {//获取一级商品分类信息
            return map.get(0);
        }
        if (type == 2) {
            return getLeveL2(map);
        }
        if (type == 3) {
            return getLeveL3(map);
        }
        return null;
//        QueryWrapper<ItemCat> queryWrapper = new QueryWrapper();
//        queryWrapper.eq("parent_id", 0);
//        List<ItemCat> list = itemCatMapper.selectList(queryWrapper);
//        //遍历list集合数据
//        for (ItemCat itemCat : list) {
//            QueryWrapper queryWrapper2 = new QueryWrapper();
//            //根据一级的ID,查询子级信息
//            queryWrapper2.eq("parent_id", itemCat.getId());
//            List<ItemCat> children = itemCatMapper.selectList(queryWrapper2);
//            //将对象进行封装
//            itemCat.setChildren(children);
//            for (ItemCat itemCat2 : children) {
//                QueryWrapper queryWrapper3 = new QueryWrapper();
//                queryWrapper3.eq("parent_id", itemCat2.getId());
//                List<ItemCat> children2 = itemCatMapper.selectList(queryWrapper3);
//                itemCat2.setChildren(children2);
//            }
//        return list;
//        }
    }

    @Override
    @Transactional
    public void updateStatus(ItemCat itemCat) {
        itemCatMapper.updateById(itemCat);
    }

    @Override
    @Transactional
    public void saveItemCat(ItemCat itemCat) {
        itemCat.setStatus(true);
        itemCatMapper.insert(itemCat);
    }

    @Override
    @Transactional
    public void updateItemCat(ItemCat itemCat) {
        itemCatMapper.updateById(itemCat);
    }

    @Override
    @Transactional
    public void deleteItemCat(Integer id, Integer level) {
        if (level == 3) {
            //如果是三级商品分类菜单则直接删除
            itemCatMapper.deleteById(id);
        }
        if (level == 2) {
            //先删除3级菜单
            QueryWrapper<ItemCat> queryWrapper = new QueryWrapper<>();
            queryWrapper.eq("parent_id", id);
            itemCatMapper.delete(queryWrapper);
            //再删除2级菜单
            itemCatMapper.deleteById(id);
        }
        if (level == 1) {
            //1.查询二级分类信息 parent_id=一级ID
            QueryWrapper<ItemCat> queryWrapper = new QueryWrapper<>();
            queryWrapper.eq("parent_id", id);
            //获取主键信息(第一列信息)
            List<Object> twoIdList = itemCatMapper.selectObjs(queryWrapper);
            //2.先删除3级
            for (Object twoId : twoIdList) {
                QueryWrapper<ItemCat> queryWrapper2 = new QueryWrapper<>();
                queryWrapper2.eq("parent_id", twoId);
                itemCatMapper.delete(queryWrapper2);
                //在删除2级
                Integer intTwoId = (Integer) twoId;
                itemCatMapper.deleteById(intTwoId);
            }
            //最后删除1级
            itemCatMapper.deleteById(id);
        }
    }

    private List<ItemCat> getLeveL2(Map<Integer, List<ItemCat>> map) {
        //1.获取1级商品分类信息
        List<ItemCat> list = map.get(0);
        //2.封装2级菜单信息
        for (ItemCat itemCat : list) {
            //如何获取该一级菜单的子级
            List<ItemCat> itemCatList = map.get(itemCat.getId());
            itemCat.setChildren(itemCatList);
        }
        return list;
    }

    private List<ItemCat> getLeveL3(Map<Integer, List<ItemCat>> map) {
        //获取二级商品分类信息    一级里边套二级
        List<ItemCat> list = getLeveL2(map);
        for (ItemCat itemCat1 : list) {
            List<ItemCat> list2 = itemCat1.getChildren();
            //根据2级查询3级信息
            if (list2 == null) continue;   //本次循环结束,直接下一次
            for (ItemCat itemCat2 : list2) {
                List<ItemCat> list3 = map.get(itemCat2.getId());
                itemCat2.setChildren(list3);
            }
            //将3级已经封装完成 将二级封装到一级中
            itemCat1.setChildren(list2);
        }
        return list;
    }
}
